<?php
/**
 * @author 段志岩
 * @date 2008.8.9
 * @summary 数据库连接类，用于管理数据库连接和执行数据库查询。
 * 	支持多个数据库的调度和轮训。
 */

class Db extends Base{
	private $configs;
	private $links;
	private $sql;
	private $result;
	private $stats = array("startTime" => -1, "endTime" => -1, "queryCount" => 0);

	/**
	 * 根据给定的数据库配置初始化数据库对象
	 *
	 * @param $oConfig <DbConfig> 数据库配置信息对象
	 */
	public function __construct($oConfig)
	{
		$this->sql = "";
		$this->startTime = time();
		$this->addConfig($oConfig);
	}
	/**
	 * 析构函数，关闭所有已打开的数据库连接
	 */
	public function __destruct()
	{
		foreach ( $this->links as $link)
		{
			@mysql_close($link);
		}
	}
	/**
	 * 获取数据库访问统计信息
	 */
	public function __get($property)
	{
		if(array_key_exists($property, $this->stats))
		{
			return $this->stats[$property];
		}
	}
	private function __set($property, $value)
	{
		if(array_key_exists($property, $this->stats))
		{
			$this->stats[$property] = $value;
		}
	}
	/**
	 * 进行数据库访问统计
	 */
	public function stats()
	{
		if($this->queryCount == 0)
		{
			$this->startTime = time();
		}
		$this->endTime = time();
	}
	/**
	 * 获取数据库连接。本函数从多个数据库连接中选择一个，进行访问。
	 * 用于多数据库的轮询。(目前尚未实现)
	 */
	private function getLink()
	{
		return $this->links[0];
	}
	/**
	 * 执行sql查询
	 */
	public function query($sql)
	{
		$this->result = mysql_query($sql, $this->getLink());
		$this->queryCount++;
		$this->stats();
		return $this->fetchArray();
	}
	/**
	 * 执行SQL更新
	 */
	public function update($sql){
		$this->result = mysql_query($sql, $this->getLink());
		$this->queryCount++;
		$this->stats();
		return $this->result;
	}
	/**
	 * 从结果集中取出记录, 存为数组并返回。
	 */
	public function fetchArray()
	{
		$r = array();
		if(!$this->result)
		{
			return false;
		}
		while(false !== ($row = mysql_fetch_array($this->result)))
		{
			$r[] = $row;
		}
		return $r;
	}
	/**
	 * 添加一个数据库配置信息。用于支持多数据库。（尚未实现）。
	 *
	 * @param $oConfig <DbConfig> 数据库配置信息对象
	 */
	public function addConfig($oDbConfig)
	{
		$this->configs[] = $oDbConfig;
		$this->links[] = mysql_connect($oDbConfig->getHost(), $oDbConfig->getUser(), $oDbConfig->getPass());
		$index = count($this->links) -1;
		mysql_select_db($oDbConfig->getName(), $this->links[$index]);
	}

	public function __toString()
	{
		return "Querys : " . $this->queryCount . ", Time : " . ($this->endTime - $this->startTime);
	}
};
?>
